HAVING 子句
概述
在 SQL 中,HAVING 子句用于过滤由 GROUP BY 子句分组后的结果集。它类似于 WHERE 子句,但 WHERE 子句在分组之前过滤数据,而 HAVING 子句在分组之后过滤数据。HAVING 子句通常与聚合函数(如 SUM, AVG, COUNT, MAX, MIN)一起使用,以根据聚合结果进行过滤。
语法
SELECT 列名1, 列名2, ..., 聚合函数(列名)
FROM 表名
GROUP BY 列名1, 列名2, ...
HAVING 条件;
SELECT:选择要查询的列。FROM:指定数据来源的表。GROUP BY:按指定的列对数据进行分组。HAVING:在分组后对数据进行过滤。
示例
示例数据库
假设我们有一个名为 orders 的表,结构如下:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
amount DECIMAL(10, 2)
);
插入一些示例数据:
INSERT INTO orders (order_id, customer_id, order_date, amount) VALUES
(1, 101, '2023-01-01', 100.00),
(2, 102, '2023-01-02', 150.00),
(3, 101, '2023-01-03', 200.00),
(4, 103, '2023-01-04', 50.00),
(5, 102, '2023-01-05', 300.00);
示例 1:使用 HAVING 过滤分组结果
假设我们想要找出订单总金额大于 200 的客户:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 200;
输出:
| customer_id | total_amount | |-------------|--------------| | 102 | 450.00 |
示例 2:结合聚合函数使用 HAVING
假设我们想要找出订单数量大于 1 的客户:
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 1;
输出:
| customer_id | order_count | |-------------|-------------| | 101 | 2 |
实践练习
练习 1
问题: 找出订单总金额大于 300 的客户,并按总金额降序排列。
提示: 使用 HAVING 子句和 ORDER BY 子句。
解答:
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 300
ORDER BY total_amount DESC;
练习 2
问题: 找出订单数量大于 2 的客户。
提示: 使用 HAVING 子句和 COUNT 聚合函数。
解答:
SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 2;
总结
HAVING 子句是 SQL 中用于过滤分组后数据的重要工具。它通常与 GROUP BY 子句和聚合函数一起使用,以根据聚合结果进行过滤。通过本教程的学习,你应该能够理解 HAVING 子句的基本用法,并能够在实际查询中灵活运用。
下一步
接下来,你可以继续学习 SQL 中的子查询、表连接等高级查询技术,以进一步提升你的 SQL 技能。